package com.freak.kotlinfitnessserver.room.dao

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import com.freak.kotlinfitnessserver.room.DeviceInfoData
import kotlinx.coroutines.flow.Flow

@Dao
interface DeviceInfoDataDao {
    // 添加参数 OnConflict 并为其赋值 OnConflictStrategy.IGNORE。
    // 参数 OnConflict 用于告知 Room 在发生冲突时应该执行的操作。
    // OnConflictStrategy.IGNORE 策略会忽略主键已存在于数据库中的新商品
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insert(deviceInfoData: DeviceInfoData): Long

    @Update
    suspend fun update(deviceInfoData: DeviceInfoData): Int

    @Delete
    suspend fun delete(deviceInfoData: DeviceInfoData): Int

    // 收集所有元素：
    // 如果你想要收集流中的所有元素到一个列表中，你可以使用 collect。但请注意，collect 是一个终端操作，
    // 它不会返回一个值，而是会处理流中的所有元素。
    // 示例：
    // val deviceInfoDataList: MutableList<DeviceInfoData> = mutableListOf()
    // flow.collect { deviceInfoDataList.add(it) }
    @Query("SELECT * from deviceInfo")
    fun getDeviceInfoDataList(): Flow<List<DeviceInfoData>>

    // Flow<DeviceInfoData>取第一个元素： 可以使用 first() 操作符来获取它。
    // 使用 single() 如果流中只有一个元素： 如果你知道流中只有一个元素，你可以使用 single() 来获取它。
    // 使用 singleOrNull() 避免异常：
    //如果你不确定流中是否只有一个元素，但想要避免异常，你可以使用 singleOrNull()。如果流为空或有多个元素，它会返回 null。
    @Query("SELECT * from deviceInfo WHERE deviceType = :deviceType")
    fun getFlowDeviceInfoData(deviceType: String): Flow<DeviceInfoData>

    @Query("SELECT * from deviceInfo WHERE deviceType = :deviceType")
    suspend fun getDeviceInfoData(deviceType: String): DeviceInfoData
}